 Drop trigger if exists nom_trigger;
   
      Delimiter //  
Create trigger nom_trigger
Before or after (insert or update or delete ) on nom_table
For each row
Begin 
 Declare var1 type; /* variables locales */ 
Declare varn type;
                         Instruction sql ;
/*gestion des exceptions ou erreurs */;

 

 End //
 Delimiter ;

 //B)Instanciation des attributs:

 

New.attribut ou old.attribut 

 

New.attribut s’applique à un évènement (insert et aussi update)   

 


Old.attribut s’applique ….........................(delete,update)

 

If new.datecom > curdate() 
       Then 
               set new.datecom=curdate() ; 
    
    C) initialisation et Affectation 
          Initialisation 
        Exemple 
        Set compteur =0;
           Set i=i+1 ;
             Set total= (select count(*) from produit); 
             Affectation
               

 

                Declare var1 ,varn int ;
                  Select sum(prix),count(quantite) into  var1, varn
                     From …..............................
      
                      ou bien 

 

      Set var1=(select sum(prix)  from ….............);
       Set varn=(select count(quantite)  from ….............);

//C) initialisation et Affectation 
          Initialisation 
        Exemple 
        Set compteur =0;
           Set i=i+1 ;
             Set total= (select count(*) from produit); 
             Affectation
               

 

                Declare var1 ,varn int ;
                  Select sum(prix),count(quantite) into  var1, varn
                     From …..............................
      
                      ou bien 

 

      Set var1=(select sum(prix)  from ….............);
       Set varn=(select count(quantite)  from ….............);

 

       

 

  //D)Structure conditionnelle alternative
   Structure simple
   If condition 
        Then 
                  Instruction sql;
     End if ; 
    
    Structure complète 
     If condition 
           Then
                      Instructions sql ;
                  Else 
                            Instruction sql ;
         End if;
   Structure imbriquée  
          If condition 
               Then 
                              Instruction sql ;
                    Elseif condition 
                             Then 
                                    Instruction sql ;
                                       Else 
                                              Instruction sql ;
               
           End if;           (Un seul End if)

 

    
Les opérateurs de comparaisons sont autorisés
=,>,<,!= ,>=,<= , <all,>all,=all ,>=all,<=all, !=all
Between ,in , like ,not (between,in,like)
Et les opérateurs logiques AND et OR

______________________________________________________________________________________________________________________

drop trigger if exists verifdatenaiss;
delimiter $
create trigger verifdatenaiss
      Before insert on animal
      for each row
      begin
      if new.datnaissa>curdate()
            then
                  signal sqlstate'45000'
                  set message_text='erreur de saisir sur la datenaiss';
      end if;
      end $;
delimiter;

update animal
set datenaissa='2024/12/20'
where numa=6;

Refaire les deux triggers en remettant à la date d'aujourd'hui les dates de naissances antidatées au lieu du message d'erreur 

/*INSERT*/
drop trigger  if exists verifdatenaiss;
delimiter $ 
create trigger verifdatenaiss
  before insert on animal 
  for each row
  begin 
  if new.datenaissa > curdate()
      then 
         set new.datenaissa=curdate();
  end if ;
  end $
  delimiter ;  
 /*test*/ 
insert into animal(numa,nump,numr,noma,datenaissa,tatouage ) 
            values(22,4,16,'milou2','2024/12/23',null);

 


UPDATE
drop trigger  if exists verifdatenaissupd;
delimiter $ 
create trigger verifdatenaissupd
  before update on animal 
  for each row
  begin 
  if new.datenaissa > curdate()
      then 
         set new.datenaissa=curdate();
  end if ;
  end $

 

  delimiter ;   

 

/*test */
update animal
  set datenaissa ='2024/12/20'
  where numa=6;

Exercice 1
Réaliser 2 triggers (insert et update) qui permettent de vérifier
 à chaque fois qu''on saisit  le prix des consultations ,
 il ne doita pas etre ne soit pas supérieur
 à la moyenne des prix des consultations.

delimiter $
 drop trigger if exists indverifprxconsult;
 create trigger indverifprxconsult
  before insert on consultation
  for each row
  begin 
  if new.prixc>(select avg(prixc) from consultation)
     then 
        signal sqlstate'45000'
            set message_text='erreur prix trop elevé';
  end if;
  end $
  delimiter ;  
  
  /*test*/        
 insert into consultation (numc,numa,numv,prixc)
                 values(17,3,3,400);

 

 


mysql>  insert into consultation (numc,numa,numv,prixc)
    ->                  values(17,3,3,400);
ERROR 1644 (45000): erreur prix trop elevé
   
UPDATE

 

delimiter $
 drop trigger if exists UPDdverifprxconsult;
 create trigger UPDverifprxconsult
  before update on consultation
  for each row
  begin 
  if new.prixc>(select avg(prixc) from consultation)
     then 
        signal sqlstate'45000'
            set message_text='erreur prix trop elevé';
  end if;
  end $
  delimiter ; 

  Exercice 2 base transair: Réaliser un trigger qui empeche de supprimer tous les vols d''air France sur la table affectation.

  drop trigger if exists verifydeletevol;
  delimiter $
  create trigger VerifyDeleteVol
  Before delete on affectation
  for each row
  Begin 
  if(old.novol like 'AF%')
  then
      signal sqlstate'45000'
      set message_text='Ce vol ne peut pas etre supprimer';
      end if;
  end $
delimiter;
/*test*/
delete from affectation where novol='Af3218';

create table archiaff as 
     Select * from affectation 
      where 2=0;

drop trigger if exists verifydeletevol; 
delimiter //
create trigger VerifyDeleteVol
      Before delete on affectation
    for each row
    Begin
    if (old.novol like 'AF%' )
     then
        signal sqlstate'45000'
        set message_text="Ce vol ne peut pas etre supprimer";
          else 
              insert into archiaff select * from affectation 
                         where novol=old.novol;  
    end if;
    end //
delimiter ;
 
TEST 
delete from affectation 
where novol ='it319';
select * from archiaff;
delete from affectation 
    where novol='af3218';

drop trigger if exists verifydeletevol;
delimiter //
create trigger VerifyDeleteVol
      Before delete on affectation
      for each row
      Begin
      if (old.novol like 'AF%')
      then 
            signal sqlstate '45000'
            set message_text= "Ce vol ne peut pas etre supprimer";
                  Else 
                        insert into archiaff select * from affectation
                              where novol=old.novol;
      end if;
      end//
delimiter ;

select * from archiaff;
delete from affectation
where novol='af3218';
Remarque

//3)crée un trigger qui permet a chaque insersion d'un pilote de calculer automatiquement son revenu mensuel et annuel
/*
Revm=salaire+comm
Reva=revm*12
Correction:*/
//1)
alter table pilote
add (revm decimal(10,2),
      reva decimal(10,2));

//2)
update pilote
set revm=salaire+ifnull(comm,0),
      reva=revm*12;
select * from pilote;
drop trigger if exists claulrev;
delimiter //
create triggers claulrev
      before insert on pilote
      for each now
      begin

      set new.revn=new.salaire+ifnull(new.comm,0);
      set new.reva=new.revn*12;
      end //
      delimiter ;
test
insert into 

/*
EXERCICE 
1)Ajouter le champs nbvol sur la table avion

drop trigger if exists increnbvol;
delimiter //
create trigger increnbvol
after insert on affectation
for each now
begin
update
 set nbvol=nbvol+1
 where nuavion=new.noavion;
end //
delimiter ;

test
 insert into affectation values('af302',curdate(),250,1243,'7693');

2)mettez à jour le nombre de vol de chaque avion

drop trigger if exist majnbvo3;
delimiter //
create trigger majnbvol3;
after update on affection
for each now
begin
 update avion av
 set nbvol=(select count(novol) from affectation a
 where a.noavion=av.nuavion);
end //
delimiter ;

3)Réaliser le trigger qui permet après chaque affectation d’un avion 
À un vol de pouvoir incrémenter le nbvol sur la table avion 
4)Réaliser un trigger qui permet 
a chaque suppression d’une affectation d’un avion a un vol
on doit mettre a jour le champs nbvol
*/

/*
exercice1: base veto realiser un trigger qui permet d'empecher la SUPPRESSION des vaccins sur la table medicament:
alter table medicament
 add tvam decimal(8,2)default 0,
 add ttcm decimal(10,2)
exercice2: BASE EMDEPT le quota attribué aux salaires des employés ne doit pas exceder les 40 000 realiser deux triggers qui verifient que le quota n'est pas dépassé:
*/

